Computer system architects typically create high-level designs for the configuration of and information flows among hardware and software components in computing systems. To produce such designs, the architects typically need to know the properties of the hardware to be used and of the software that will be deployed on that hardware. Software developers also typically need to be aware of the characteristics of the hardware on which their software will eventually be deployed.